// 传感器特性结构体
struct characteristics {
  unsigned short NumberOfPixel;   // 总像素数
  unsigned char NumberOfBlocks;   // 数据块数量
  unsigned char RowPerBlock;      // 每块行数
  unsigned short PixelPerBlock;   // 每块像素数
  unsigned short PixelPerColumn;  // 每列像素数
  unsigned short PixelPerRow;     // 每行像素数
  unsigned char AllowedDeadPix;   // 允许坏点数
  unsigned short TableNumber;     // 查找表编号
  unsigned short TableOffset;     // 查找表偏移量
  unsigned char PTATPos;          // PTAT数据位置
  unsigned char VDDPos;           // VDD数据位置
  unsigned char PTATVDDSwitch;    // PTAT/VDD切换位
  unsigned char CyclopsActive;    // 特殊模式激活标志
  unsigned char CyclopsPos;       // 特殊模式数据位
  unsigned char DataPos;          // 有效数据起始位
};

// 传感器特性实例
characteristics DevConst = {
  NUMBER_OF_PIXEL,   // 总像素数
  NUMBER_OF_BLOCKS,  // 数据块数量
  ROW_PER_BLOCK,     // 每块行数
  PIXEL_PER_BLOCK,   // 每块像素数
  PIXEL_PER_COLUMN,  // 每列像素数
  PIXEL_PER_ROW,     // 每行像素数
  ALLOWED_DEADPIX,   // 允许坏点数
  TABLENUMBER,       // 查找表编号
  TABLEOFFSET,       // 查找表偏移量
  PTAT_POS,          // PTAT数据位置
  VDD_POS,           // VDD数据位置
  PTAT_VDD_SWITCH,   // PTAT/VDD切换位
  ATC_ACTIVE,        // 特殊模式激活标志
  ATC_POS,           // 特殊模式数据位
  DATA_POS,          // 有效数据起始位
};

//-----------------------------------------
// EEPROM数据
unsigned char mbit_calib, bias_calib, clk_calib, bpa_calib, pu_calib,                       // 校准参数（模式/偏置/时钟等）
  mbit_user, bias_user, clk_user, bpa_user, pu_user;                                        // 用户参数
unsigned char nrofdefpix, gradscale, vddscgrad, vddscoff, epsilon, lastepsilon, arraytype;  // 校准系数
unsigned char deadpixmask[ALLOWED_DEADPIX];                                                 // 坏点掩码数组
signed char globaloff;                                                                      // 全局温度偏移
signed short thgrad[PIXEL_PER_COLUMN][PIXEL_PER_ROW];                                       // 温度梯度系数
unsigned short tablenumber, vddth1, vddth2, ptatth1, ptatth2, ptatgr, globalgain;           // 查找表参数
unsigned short deadpixadr[ALLOWED_DEADPIX * 2];                                             // 坏点地址列表
signed short thoffset[PIXEL_PER_COLUMN][PIXEL_PER_ROW];                                     // 温度偏移系数
signed short vddcompgrad[ROW_PER_BLOCK * 2][PIXEL_PER_ROW];                                 // VDD补偿梯度
signed short vddcompoff[ROW_PER_BLOCK * 2][PIXEL_PER_ROW];                                  // VDD补偿偏移
unsigned long id, ptatoff;                                                                  // 芯片ID/PTAT偏移
float ptatgr_float, ptatoff_float, pixcmin, pixcmax, bw;                                    // 浮点计算参数
unsigned long *pixc2_0;                                                                     // 像素常数存储起始地址
unsigned long *pixc2;                                                                       // 像素常数动态指针

//-----------------------------------------
// 传感器数据
unsigned short data_pixel[PIXEL_PER_COLUMN][PIXEL_PER_ROW];       // 原始像素数据存储
unsigned char RAMoutput[2 * NUMBER_OF_BLOCKS + 2][BLOCK_LENGTH];  // 原始数据块存储
/*
  RAMoutput存储原始数据块示例：
  [0-3][]...顶部数据块
  [4-5][]...电气偏移
  [6-9][]...底部数据块
*/
unsigned short eloffset[ROW_PER_BLOCK * 2][PIXEL_PER_ROW];  // 电气偏移量
unsigned char statusreg;                                    // 传感器状态寄存器
unsigned short Ta, ptat_av_uint16, vdd_av_uint16;           // 平均温度/VDD值

// 传感器缓冲数据
uint16_t ptat_buffer[PTAT_BUFFER_SIZE];  // PTAT温度缓冲区
uint16_t ptat_buffer_average;            // PTAT平均值
uint8_t use_ptat_buffer = 0;             // PTAT缓冲使能
uint8_t ptat_i = 0;                      //
uint8_t PTATok = 0;                      // PTAT就绪标志
uint16_t vdd_buffer[VDD_BUFFER_SIZE];    // VDD电压缓冲区
uint16_t vdd_buffer_average;             // VDD平均值
uint8_t use_vdd_buffer = 0;              // VDD缓冲使能
uint8_t vdd_i = 0;
uint8_t use_eloffsets_buffer = 0;  // 电气偏移缓冲使能
uint8_t new_offsets = 1;           // 新偏移标志

// 程序控制
bool switch_ptat_vdd = 0;                         // PTAT/VDD测量切换标志
unsigned char adr_offset = 0x00;                  // 寄存器地址偏移
unsigned char send_data = 0;                      // 数据发送许可
unsigned short picnum = 0;                        // 图像序列号
unsigned char state = 0;                          // 状态机状态
unsigned char read_block_num = START_WITH_BLOCK;  // 当前读取块号
unsigned char read_eloffset_next_pic = 0;         // 下次读取电气偏移标志
unsigned char gui_mode = 0;                       // GUI显示模式
unsigned char wait_pic = 0;                       // 等待图像标志
bool ReadingRoutineEnable = 1;                    // 数据采集使能

// 辅助参数
uint32_t gradscale_div;         // 梯度缩放因子
uint32_t vddscgrad_div;         // VDD梯度缩放
uint32_t vddscoff_div;          // VDD偏移缩放
int vddcompgrad_n;              // VDD补偿梯度计数
int vddcompoff_n;               // VDD补偿偏移计数
unsigned long t1;               // 计时基准
unsigned char print_state = 0;  // 打印状态

// LED控制
unsigned char pinLEDred = 2;     // 红色LED引脚


// 全局标志
unsigned NewDataAvailable = 1;  // 新数据就绪标志
unsigned short timert;          // 定时器计数
char serial_input = 'm';        // 串口输入缓存